/**
 * 数据库测试数据种子脚本
 * 
 * 用法:
 *   npm run seed:test          # 运行种子脚本
 *   npm run seed:test -- -f    # 强制运行(无需确认)
 * 
 * 环境变量:
 *   API_URL - API基础URL (默认: http://localhost:3000)
 *   NODE_ENV - 环境 (development/test/production)
 */

import { PrismaClient } from '@prisma/client';
import { info, warn, error } from '../src/utils/logger';
import { SeedDataManager } from '../src/lib/SeedDataManager';
import readline from 'readline';

// 序列化错误对象为可记录的格式
function serializeError(err: unknown): Record<string, unknown> {
  if (err instanceof Error) {
    return {
      name: err.name,
      message: err.message,
      stack: err.stack,
      ...(err as any) // 包含可能的额外属性
    };
  }
  return { error: String(err) };
}

async function confirmAction(): Promise<boolean> {
  if (process.env.NODE_ENV === 'production' && !process.argv.includes('-f')) {
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });

    warn('\n⚠️  警告: 即将在生产环境中执行数据初始化!');
    warn('这将清空以下表中的所有现有数据:');
    warn('- User (用户)');
    warn('- Question (题目)');
    warn('- Evaluation (评估)');
    warn('- Submission (提交)');
    warn('- AuditLog (审计日志)');
    
    return new Promise((resolve) => {
      rl.question('\n确定要继续吗? (yes/no): ', (answer) => {
        rl.close();
        resolve(answer.toLowerCase() === 'yes');
      });
    });
  }
  return true;
}

async function main() {
  try {
    // 环境检查
    if (!await confirmAction()) {
      info('操作已取消');
      process.exit(0);
    }

    // 初始化数据库客户端
    const prisma = new PrismaClient({
      log: [
        { level: 'warn', emit: 'event' },
        { level: 'error', emit: 'event' }
      ],
      errorFormat: 'pretty'
    });

    // 监听Prisma事件
    prisma.$on('error', (e) => {
      error('数据库错误:', { error: serializeError(e) });
    });

    prisma.$on('warn', (e) => {
      warn('数据库警告:', { warning: serializeError(e) });
    });

    // 执行种子数据初始化
    const manager = new SeedDataManager(prisma);
    const result = await manager.seed();

    // 显示结果概要
    const BASE_URL = process.env.API_URL || 'http://localhost:3000';
    
    info('\n📊 数据初始化完成');
    info('══════════════\n');

    info('API 配置:');
    info(`• 基础URL: ${BASE_URL}`);
    info(`• API版本: v1`);
    info(`• 接口文档: ${BASE_URL}/api-docs`);
    info(`• 健康检查: ${BASE_URL}/health`);

    info('\n测试账号:');
    info(`• 管理员: admin@test.com    / ${result.password}`);
    info(`• 教师:   teacher@test.com  / ${result.password}`);
    info(`• 学生:   student@test.com  / ${result.password}`);

    info('\nAPI调用示例:');
    info('curl -X POST \\');
    info(`  ${BASE_URL}/api/v1/auth/login \\`);
    info('  -H "Content-Type: application/json" \\');
    info(`  -d '{"email":"admin@test.com","password":"${result.password}"}'`);

    info('\n常用接口:');
    info('• GET    /api/v1/questions        - 获取题目列表');
    info('• GET    /api/v1/evaluations     - 获取评估列表');
    info('• POST   /api/v1/submissions     - 提交答案');
    info('• GET    /api/v1/submissions/:id - 获取提交详情\n');

    await prisma.$disconnect();

  } catch (err) {
    error('❌ 数据初始化失败:', { error: serializeError(err) });
    process.exit(1);
  }
}

// 处理进程信号
process.on('SIGINT', () => {
  warn('\n已收到SIGINT信号,正在清理...');
  process.exit(0);
});

process.on('SIGTERM', () => {
  warn('\n已收到SIGTERM信号,正在清理...');
  process.exit(0);
});

// 处理未捕获的错误
process.on('uncaughtException', (err) => {
  error('未捕获的异常:', { error: serializeError(err) });
  process.exit(1);
});

process.on('unhandledRejection', (err) => {
  error('未处理的Promise拒绝:', { error: serializeError(err) });
  process.exit(1);
});

// 执行主函数
if (require.main === module) {
  main();
}
